package org.sun.sunshine.io.nio;

public class Desc {
    /**
     * 同步非阻塞
     * nio  采用了io 多路复用的技术，主要有两个抽象channel，轮训期（select，poll）
     * 其中channel  就是一个客户端的链接请求，select 是一个多路复用器，
     * select 会循环监听多个channel，当channel 有请求发送时，select 会通知程序，程序再对channel 进行处理。
     * 这样一个线程内就可以处理多个socket连接，从而提高效率。
     *
     *
     * select 在查询 channel 的时候会涉及到用户态和内核态的切换，如果一个一个查是很耗时的，
     * 所以轮训期 会把所有channel 的 fds 放到一个数组中，然后调用操作系统的api，操作系统会遍历这个数组，一次性的把多个channel（多路）
     * 查出来，然后把结果放到一个数组中，这样用户态和内核态的切换就省了，从而提高效率。而这就是所谓的：多路复用。
     *
     * select 的缺点是： 传递fds 是有限制的。
     * poll 是没有限制的
     *
     * 但是无论是select 还是poll 其实都是内核进行遍历然后把结果返回。那有没有不需要遍历，channel 的状态好了以后就就告诉通知方法的呢。
     * 答案就是epoll。epoll 的原理是，当channel 状态好了以后，内核会通知程序，程序再对channel 进行处理。
     *
     * 他会在内核中建立一个红黑树，和一个双向链表，红黑树用于记录fds，双向链表用于记录已经准备好的channel。
     * 当channel 状态好了以后，内核会通知程序，程序再对channel 进行处理。
     *
     */
}
